我的ERP资源 My ERP Resources ABAP |
ABAP是一种高级企业应用编程语言(Advanced Business Application Programming),起源于20世纪80年代。经过不断的发展,现在的版本为ABAP/4,SAP R/3的应用程序就是用ABAP/4编写的。
1、在SE38环境下的程序名输入栏输入'DEMO*'后按F4,你可以查到SAP所有的DEMO示例程序,好好看看,你会学到很多ABAP功能的实现方法。
2、运行“ABAPDOCU”T-cdoe,你可以看到ABAP DOCUMENT及示例程序。
3、想提高ALV的编程水平吗?在SE38环境下的程序名输入栏输入'BCALV*'后按F4,你可以查到很多ALV示例程序,慢慢看吧。
首先要介绍事务代码(Transaction Code)的概念:在SAP中,每一个功能基本上都对应一个事务代码,可以输入相应的事务代码来执行相应的功能,事务代码在SAP Menu下面的输入框中输入。
001、第一个ABAP程序,Hello World。
1.用ABAP Report来实现:
(1)进入SAP系统—〉SE38。
(2)输入程序名z_hello,选择Create。注意:自己开发的程序一定要用 Z 或者 Y 开头,这是因为SAP在升级的时候不会覆盖这些程序。
(3)这时会弹出一个对话框,输入Title,选择Type为 Executable Program 。
(4)然后会弹出一个对话框,选择开发类(Package)。如果有自己的开发类,输入就可以;没有直接点下面的Local Object。
(5)ABAP编辑器出现,输入代码:Write: 'Hello,World!' .
(6)按Ctrl+F2:语法检查;Ctrl+F3:激活;F8:执行。
到这里,ABAP的第一个程序就完成了,很简单!
2.用 ABAP Dialog来实现:
比较麻烦,在这里详细介绍怎么建立SCREEN。
(1)建立一个Dialog程序,步骤同上,只不过在Type里选择Module Pool。假设程序名为:Z_SCREEN。
(2)执行SE51,在Program里输入程序名称:Z_SCREEN;在Screen Number里输入屏幕的号码:9000;然后点Create。
(3)在Short Description中输入描述:hello world screen。
(4)点Layout,调出屏幕编辑器,建立一个标签,输入Hello World。
(5)点激活,或者Ctrl+F3。
(6)执行SE93:建立事务代码:输入z_hello,点Create,会出现对话框,输入Short Text,选择Program and Screen,然后输入建立的程序名以及屏幕号,这里是Z_SCREEN,9000
(7)点保存,会出现对话框,选择Local Object。
好了,执行z_hello。不过这个程序还没有退出的功能,你可以考虑后面会慢慢加上去。
最后,综述:
·ABAP编程不是简单的编程,SAP中最主要的语言:一个是ABAP,一个是Java。
·ABAP以后的路应该往OO方向发展,还有Java方面、ITS集成、最新BSP技术等,也是ABAPer需要了解和掌握的。
·开发包括几大部分,最简单的Report和Dialog,还有很多其他的,比如Web、Workflow、BAPI以及和其他PC系统的接口。
·Report最简单,最重要的是提高代码执行效率。(SD的报表是多多的,表也是大大的,月报表是运行慢慢的,以后发展的路就是提高SD报表运行的效率。)
·Dialog不常用,除非需要开发自己的一套系统,只是使用SAP平台。
·Workflow要和HR相结合,所以需要理解HR的业务内容。
·Web的东西更多,EP只是一个平台,不能满足所有的功能。
002、写个小程序,通过字段查找表
REPORT Z_WUMG_TEST001_2012.
*定义所要用到的透明表
TABLES: DD02T, DD03L, DD02L.
*定义结构体
DATA: BEGIN OF field1 OCCURS 0.
INCLUDE STRUCTURE dd03l.
DATA:
END OF field1.
DATA: BEGIN OF field2 OCCURS 0.
INCLUDE STRUCTURE dd03l.
DATA su TYPE i.
DATA:
END OF field2.
*
DATA:field_sum TYPE i.
*定义选择屏幕
SELECT-OPTIONS:
ified FOR dd03l-fieldname,
ittype FOR dd02l-tabclass.
*
DATA fieldsum TYPE i.
*
SELECT *
FROM dd03l
INTO TABLE field1
WHERE fieldname IN ified.
SORT field1 BY tabname.
LOOP AT ified.
fieldsum = sy-tabix.
ENDLOOP.
LOOP AT field1.
field_sum = field_sum + 1.
MOVE-CORRESPONDING field1 TO field2.
AT END OF tabname.
field2-su = field_sum.
COLLECT field2.
CLEAR field2.
CLEAR field_sum.
ENDAT.
ENDLOOP.
LOOP AT field2 WHERE su = fieldsum.
SELECT SINGLE *
FROM dd02t
WHERE tabname = field2-tabname
AND ddlanguage = sy-langu.
SELECT SINGLE *
FROM dd02l
WHERE tabname = field2-tabname
AND tabclass IN ittype
AND as4local = field2-as4local
AND as4vers = field2-as4vers.
*定义被显示的表中必须有1条以上记录,如果没有记录值的表将不被显示出来,
*因此此处设定 SY-SUBRC = 0 表示只要有1条以上记录值的表,都将显示出来。
IF sy-subrc = 0.
WRITE: / field2-tabname,dd02l-tabclass,dd02t-ddtext.
ENDIF.
ENDLOOP.
003、已知透明表,展示你想要的字段信息
REPORT Z_WUMG_REPORT001_2012 .
data: begin of itab occurs 0,
matnr like mara-matnr,
ernam like mara-ernam,
end of itab.
data: itab1 type table of mara with header line.
* Selection Screen
*PARAMETERS input(12) TYPE c DEFAULT 'WUMG'.
start-of-selection.
select * from mara into CORRESPONDING FIELDS OF TABLE itab.
end-of-selection.
* Dynpro
*CALL SCREEN 100.
* List
*SKIP TO LINE 10.
*POSITION 40.
*WRITE input.
loop at itab.
write itab-matnr.
write itab-ernam.
skip.
endloop.
004、采购订单合计数量和收货总量的统计报表
REPORT Z_WUMG_REPORT002_2012 .
*定义所要用到的表
TABLES: EKKO,EKET,EKPO.
*定义内表
DATA: BEGIN OF ITAB OCCURS 0,
EBELN LIKE EKKO-EBELN,
MATNR LIKE EKPO-MATNR,
MENGE LIKE EKPO-MENGE,
WEMNG LIKE EKET-WEMNG,
END OF ITAB.
*定义数据
DATA:
MATNR LIKE EKPO-MATNR,
MENGE LIKE EKPO-MENGE,
WEMNG LIKE EKET-WEMNG,
EBELN LIKE EKPO-EBELN.
*选择屏幕
Select-OPTIONS:
EBELN1 FOR EKKO-EBELN,
BEDAT FOR EKKO-BEDAT,
EKGRP FOR EKKO-EKGRP.
PARAMETERS:
R1 RADIOBUTTON GROUP RADI,
R2 RADIOBUTTON GROUP RADI,
R3 RADIOBUTTON GROUP RADI.
*到表里查询需要的相关数据
Select K~EBELN
INTO CORRESPONDING FIELDS OF TABLE ITAB
FROM EKKO AS K
Where K~EBELN IN EBELN1
AND K~BEDAT IN BEDAT
AND K~EKGRP IN EKGRP.
LOOP AT ITAB.
Select SUM( MENGE ) INTO ITAB-MENGE
FROM EKPO
Where EBELN EQ ITAB-EBELN.
MODIFY ITAB.
ENDLOOP.
LOOP AT ITAB.
Select SUM( WEMNG ) INTO ITAB-WEMNG
FROM EKET
Where EBELN EQ ITAB-EBELN.
MODIFY ITAB.
ENDLOOP.
*定义输出界面字段信息
WRITE: /'采购凭证号',22 '物料号码',
41 '采购订单合计数量',59 '收到货物合计数量',
95 '完成标志'.
ULINE AT /1(130).
*定义输出字段信息所列内容
SORT itab BY ebeln ASCENDING.
LOOP AT ITAB.
WRITE: itab-EBELN,
itab-MATNR,
itab-MENGE,
itab-WEMNG.
ULINE AT /1(130).
* SKIP.
ENDLOOP.
005、ALV程序设计简单例子1
REPORT Z_WUMG_REPORT003_2012 .
*定义所要用到的表
Tables: MARA.
*定义内表
data: begin of itab occurs 0,
MATNR LIKE MARA-MATNR,
MTART LIKE MARA-MTART,
MEINS LIKE MARA-MEINS,
end of itab.
*
type-pools: slis.
*定义一个显示的内表的一行
DATA:
L_ALV_FILED TYPE SLIS_FIELDCAT_ALV.
*定义显示的一列的框架
DATA:
L_ALV_FILEDCAT TYPE SLIS_T_FIELDCAT_ALV.
CLEAR L_ALV_FILED.
*定义第1、2、3列的属性
*定义显示位置,显示的字段.在下面传递内表中的名字一样的值
*显示标题名字
L_ALV_FILED-COL_POS = 1.
L_ALV_FILED-FIELDNAME = 'MATNR'.
L_ALV_FILED-seltext_M = '物料号码'.
APPEND L_ALV_FILED TO L_ALV_FILEDCAT.
L_ALV_FILED-COL_POS = 2.
L_ALV_FILED-FIELDNAME = 'MTART'.
L_ALV_FILED-seltext_M = '物料类型'.
APPEND L_ALV_FILED TO L_ALV_FILEDCAT.
L_ALV_FILED-COL_POS = 3.
L_ALV_FILED-FIELDNAME = 'MEINS'.
L_ALV_FILED-seltext_M = '基本计量单位'.
APPEND L_ALV_FILED TO L_ALV_FILEDCAT.
*选择屏幕
SELECT-OPTIONS:
P_MATNR FOR MARA-MATNR,
P_MTART FOR MARA-MTART,
P_MEINS FOR MARA-MEINS.
*查询以下三个字段的数据,然后放入这个内表
SELECT MATNR
MTART
MEINS
INTO CORRESPONDING FIELDS OF TABLE ITAB
FROM MARA
WHERE MATNR IN P_MATNR AND MEINS IN P_MEINS AND MTART IN P_MTART.
APPEND ITAB.
*然后调用以下的这个函数.然后把定义的显示框架和数据内表传递过去.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
IT_FIELDCAT = L_ALV_FILEDCAT
Tables
t_outtab = ITAB.
006、ALV程序设计简单例子2
REPORT ZWUMGD.
*定义所要用到的表
TABLES: MARA, MAKT.
*定义内表
DATA: BEGIN OF ITAB OCCURS 0,
MATNR LIKE MARA-MATNR,
MAKTX LIKE MAKT-MAKTX,
MANDT LIKE MAKT-MANDT,
END OF ITAB.
*定义ALV
TYPE-POOLS: slis.
DATA: go_grid type ref to cl_gui_alv_grid.
data: gt_fieldcat type lvc_t_fcat,
gs_fieldcat type lvc_s_fcat.
DATA:INFO type standard table of X031L.
DATA: INFO_TAB type X031L .
data: ls_fieldcat type lvc_s_fcat.
DATA: it_fcat TYPE slis_t_fieldcat_alv,
is_fcat LIKE LINE OF it_fcat.
DATA: it_fieldcat TYPE lvc_t_fcat,
is_fieldcat LIKE LINE OF it_fieldcat.
***********************************************
DATA: MATNRX LIKE MARA-MATNR. "物料描述
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
*PARAMETERS: P_MATNR LIKE MARA-MATNR OBLIGATORY.
SELECT-OPTIONS: S_MATNR FOR MARA-MATNR OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1. " 选择屏幕
AT SELECTION-SCREEN. " 在选择屏幕上需要执行的操作
** select single matnr into MATNRX FROM MARA WHERE MATNR IN S_MATNR.
* "根据选择屏幕条件判断,单值用 = ,多值用 IN .
* IF SY-SUBRC = 0.
* ELSE.
* MESSAGE E000.
* ENDIF.
START-OF-SELECTION. "用于数据库取数和逻辑处理
* SELECT SINGLE MATNR MAKTX INTO (ITAB-MATNR, ITAB-MAKTX) FROM MAKT
* WHERE MATNR IN S_MATNR.
SELECT * FROM MAKT INTO CORRESPONDING FIELDS OF TABLE itab
WHERE MATNR IN S_MATNR
AND SPRAS = '1'.
**********************************************************
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'MATNR'.
ls_fieldcat-key = 'X'. "用于列蓝色背景显示。
ls_fieldcat-scrtext_l = '物料号码'.
APPEND ls_fieldcat TO gt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'MAKTX'.
* ls_fieldcat-key = 'X'. "用于列蓝色背景显示。
ls_fieldcat-scrtext_l = '物料描述'.
APPEND ls_fieldcat TO gt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'MANDT'.
* ls_fieldcat-key = 'X'. "用于列蓝色背景显示。
ls_fieldcat-scrtext_l = '集团'.
APPEND ls_fieldcat TO gt_fieldcat.
*******************ALV字段分配(参照要输出的内表)**************
END-OF-SELECTION. "数据展示
***********************WRITE 输出*******************************
* LOOP AT ITAB.
* WRITE:/ ITAB-MATNR, ITAB-MAKTX.
* SKIP.
* ENDLOOP.
******************************************************************
***************ALV输出(ALV函数调用)*****************************
create object go_grid exporting
i_parent = cl_gui_container=>screen0.
DATA: SLA TYPE LVC_S_LAYO.
sla-GRID_TITLE = '物料编码查询表'.
DATA:
IT_SORT TYPE LVC_T_SORT,
IT_TAB TYPE LVC_S_SORT.
DATA: IS_VARIANT TYPE DISVARIANT.
IS_VARIANT-REPORT = SY-REPID.
sla-cwidth_opt = 'X'.
call method go_grid->set_table_for_first_display
exporting
i_save = 'A'
IS_VARIANT = IS_VARIANT
is_layout = sla
changing
it_outtab = ITAB[]
it_fieldcatalog = gt_fieldcat[]
exceptions
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
others = 4.
WRITE:/ .
SAP R/3 ABAP 开发过程中一些总结
1、ST05是用于在开发ABAP程序时,对应事务码取得的字段是“数据结构”而不是“透明表”的时候,通过ST05的“SQL跟踪”来获得相关“Select”的语句;一般查看“REC”列耗时比较多的“Select”语句; 2、跟踪时如果有涉及到“数量”这类有对数据表进行更新或插入操作的,则直接去查Update和Insert的SQL语句; 3、在跟踪后,直接双击“对象名”列的名称,点选“表格”转到“SE11”的表字段表; 4、ABAP程序开头的Tables:“数据表名”,只有在屏幕中有用到的表,才需要声明;在程序中用到的表则不需要进行在Tables内声名; 5、抓SAP“文本”字段的数据,要先自定义变量,然后通过SE37的函数“FUNCTION ’ZREAD_TEXT’”取回文本数据; 6、新建的ABAP程序,在测试运行的时候要先进行“激活”,才能测试运行; 7、SE93:把ABAP写好的程序指定一个事务码执行; 8、abap引号内的字符’’必须要是大写; 9、ABAP select 里面的语句,不能像mssql有那么丰富的函数使用,需要导到内表后再对数据进行操作; 10、’EQ’是单个数据值,’BT’是between区间的意思。 11、在写select inner join 里面,要注意是否需要加上销售组织的条件;on 条件1 and 销售组织条件。 12、SELECTION-SCREEN,里面有两个子项,PARAMETERS和select-options。 PARAMETERS 一般是用于必输项的屏幕参数设置,如果这个参数不是必输项的,就要用select-options。在select ...where条件里,用PARAMETERS的条件语法是“数据字段 = 屏幕字段”;而select-options的条件语法是“数据字段 in 屏幕字段”。 13、在where判断一个日期型数据是空,不是DEAKT = ’’,也不是DEAKT is initial,而应该写成DEAKT = ’00000000’ (8个0)。 14、一对多的inner join,如果取出的数据有重复,前面加上distinct,用法和MSSQL相同。 15、sy-subrc,指上一个语句执行是否成功;执行成功返回0,执行不成功返回非0。用if判断。 16、如果一个语句中,该名称同时可能代表内表或者同名表工作区,则需要在内表名称之后加“[]”指明当前操作的是内表对象。不提倡使用带有表头行的内表,而是应该总是声明结构相同的其他数据对象作为显示工作区进行内表行操作。 如何调整ABAP程序的性能(copy) 1、使用where语句 不推荐 Select * from zflight. Check : zflight-airln = ‘LF’ and zflight-fligh = ‘BW222’. Endselect. 推荐 Select * from zflight where airln = ‘LF’ and fligh = ‘222’. Endselect. 2、使用聚合函数 不推荐 Maxnu = 0. Select * from zflight where airln = ‘LF’ and cntry = ‘IN’. Check zflight-fligh > maxnu. Maxnu = zflight-fligh. Endselect. 推荐 Select max( fligh ) from zflight into maxnu where airln = ‘LF’ and cntry = ‘IN’. 3、使用视图代替基本表查询 不推荐 Select * from zcntry where cntry like ‘IN%’. [Page] Select single * from zflight where cntry = zcntry-cntry and airln = ‘LF’. Endselect. 推荐 Select * from zcnfl where cntry like ‘IN%’ and airln = ‘LF’. Endselect. 4、使用INTO table 代替select endselect 不推荐 Refresh: int_fligh. Select * from zflight into int_fligh. Append int_fligh. Clear int_fligh. Endselect. 推荐 Refresh: int_fligh. Select * from zflight into table int_fligh. 5、使用批量修改内表代替逐行修改 不推荐 Loop at int_fligh. If int_fligh-flag is initial. Int_fligh-flag = ‘X’. Endif. Modify int_fligh. Endloop. 推荐 Int_fligh-flag = ‘X’. Modify int_fligh transporting flag where flag is initial. 6、使用二分法查询,提高查询内表数据速度 不推荐 Read table int_fligh with key airln = ‘LF’. 推荐 Read table int_fligh with key airln = ‘LF’ binary search. 7、两个内表添加使用批量增加代替逐行 不推荐 Loop at int_fligh1. Append int_fligh1 to int_fligh2. Endloop. 推荐 Append lines of int_fligh1 to int_fligh2. 8、使用table buffering Use of buffered tables is recommended to improve the performance considerably. The buffer is bypassed while using the following statementsSelect distinct Select … for update Order by, group by, having clause Joins Use the Bypass buffer addition to the select clause in order to explicitly bypass the buffer while selecting the data. 9、 使用FOR ALL Entries 不推荐 Loop at int_cntry. Select single * from zfligh into int_fligh where cntry = int_cntry-cntry. Append int_fligh. Endloop. 推荐 Select * from zfligh appending table int_fligh For all entries in int_cntry Where cntry = int_cntry-cntry. 10、正确地使用where语句,使查询能使用索引When a base table has multiple indices, the where clause should be in the order of the index, either a primary or a secondary index To choose an index, the optimizer checks the field names specified in the where clause and then uses an index that has the same order of the fields. One more tip is that if a table begins with MANDT, while an index does not, there is a high possibility that the optimizer might not use that index. 11、正确地使用MOVE语句 Instead of using the move-corresponding clause it is advisable to use the move statement instead. Attempt should be made to move entire internal table headers in a single shot, rather than moving the fields one by one. 12、正确地使用inner joinLet us take an example of 2 tables, zairln and zflight. The table zairln has the field airln, which is the airline code and the field lnnam, which is the name of the airline. The table zflight has the field airln, the airline code and other fields which hold the details of the flights that an airline operates. [Page] Since these 2 tables a re logically joined by the airln field, it is advisable to use the inner join. Select a~airln a~lnnam b~fligh b~cntry into table int_airdet From zairln as a inner join zflight as b on a~airln = b~airln. In order to restrict the data as per the selection criteria, a where clause can be added to the above inner join. 13、使用sort by 代替order by 14、避免使用SELECT DISTINCT语句 使用的 ABAP SORT + DELETE ADJACENT DUPLICATES 代替. 定义内表与工作区最方便的方法 *定义 名为 ITAB 的内表, 内表结构 参照表 TABLE 。 DATA: ITAB TYPE TABLE OF TABLE. *定义 名为 WA 的工作区, 其 行结构与 内表 ITAB 相同 。 DATA: WA LIKE LINE OF ITAB. ---------------------------------------------------------------- 1.使用occurs 0,定义的不再是对象,而是internal table 2.使用with header line后缀,定义为internal table的同时也定义了一个同名对象,因此可以用以下语句: LOOP AT STH. WRITE: / STH. ENDLOOP. 3.TYPE后面接结构,LIKE后面接对象 4.OBLIGATORY为必输字段 5.DATA SEPARATER . = DATA SEPARATER TYPE C. 6.关于内表的结构描述,它的当前记录数据是放在header line中的,Occurs 是分配数据缓冲区,大小不重要,系统会自动分配。但定义内表不用occurs就需要用with header line,occurs语句记得是为了向下兼容。 7.occurs 指明的數量是有一點學問的. 1.當你知道可能每次用Select命中或交換的紀錄數xxx時,可指明 occurs xxx. 2.如用occurs 0 聲明時, buffers 由系統自動分配. 8.SELECT 在into时记得一般都要加上table,不然是into一个工作区,即wa,而工作区要写入内表,则需要再append,所以直接定放内表即可,内表和工作区的区别就在于工作区就相当于表头,是有一行,data定义begin of itab时不加occurs就是工作区,加了就是内表,occurs *,后面表示系统初始分配给此内表多少行,每次满时再多分配多少行,我们平常为了节约内存,一般直接用0,with header line是为了定义含表头的内表,平常occurs就直接带表头,而with header line一般是在itab1 like itab occurs 0 with header line时用,这是参照一个内表定义另一内表,如果要带表头,一定要加with header line。 你这样问不是办法,最好不懂时直接接F1,查到SAP的帮助即可. check是检查后面的逻缉是否满足,不满足则在上例是跳出form,不的执行下面的语句。 说实在,初略的看了一下上面的程序,写得太烂了,竟然将usr01或usr03透明表中的字段按条件取到一个表工作区,竟然不加single,象这种不加single的select按理说应该是调不过的,必须在后面再对应一个endselect,而这种select加endselect用每次去读一次透明表,访问数据库的次数太多了,换个好一点程序自己研究吧。 SAP ABAP PA certification 培训笔记 P (4) 长度4个字节 Xstring (10) 长度为10个字节,可以容纳20个数字 大结构体与小结构体的兼容 Move 大 to 小 大的覆盖小的 大结构体的剩余部分保持不变 Move 小 to 大 匹配的部分 被小的覆盖, 其余的字段被初始化 P 类型 与 F类型的优缺点 P:计算精确,适合商业结算,但范围短 F:储存范围大,计算不精确 P 与 F 类型的运算方式 F IEEE 用二进制数进行运算 P 采用半字节储存一个数字的方式进行运算 字段 结构体 兼容问题 1. 字段兼容:类型和长度相同 2. 结构体:字段按顺序兼容,并且字段数相同 3. 内表兼容:行类型相同, KEY 兼容,表类型相同 如果字符串 move 到一个比字符串小的结构体 , [][][][] ---à [][] [][] 一个字段 move 到一个 内表中 Internal table 内表. 1. 静态数据对象包括: 简单数据类型(除了string 和xstring 类型), 结构体(不包含string 和xstring 类型) 2. 动态数据对象:string , xstring , 包含string 或 xstring 的结构体, 内表 一个结构体是否可以包含STRING 或xstring, 如果可以 结构体可以拓展吗? 定义一个 只有一个字段的 内表 字段长度是c(18), 定义一个结构体 结构体里 包含三个字段, 类型 随意, 第二个类型,是另一个结构体 定义一个内表 内表的行类型 是第一个结构体. 再用第二个结构体定义一个内表 ,利用这个内表 作为行类型,做一个内表 内表的三个基本属性 1. line type 行类型 2. key definition 键类型 3. table kind 表类型 1) 在standard table 中 使用 table key的查找方式为 table scan 全表扫描 2) 在 sorted table 中使用table key 在遵循; left-aligned 从左至右匹配, no gaps 没有间隔,使用”=” 填充字段时, 使用 二分查找法 ,其它情况下 使用 table scan查找 3) 对hash表访问, 只能通过key访问单条记录, 访问的速度不依赖于表中的数据量,而在其余两种表中,查询的时间与表中数据量成正比 其它情况是否代表,只是顺序不符合left-aligned. 哈希表可以通过部分的key 进行访问吗? 定义内表 1. 定义一个局部内表类型,通过该类型定义内表变量 2. 直接定义字段 直接定义内表变量(隐藏了一个内表类型) 3. 通过全局内表类型定义内表变量 标准的定义内表语句 Types or DATA name TYPE table_kind OF line_type WITH key_def [INITIAL SIZE n.] Table kind and key. 表类型 和 表键 注意:在定义standard类型的内表时,如果使用 WITH DEFAULT KEY. 系统会自动将内表中的字符类型字段(c,n,d,t,x,string,xstring)组合成table key. 内表的key 1. standard标准表: key 不唯一. 2. sorted排序表: 可以指定KEY是否唯一 3. Hash 哈希表: KEY必须是唯一 在内表中使用不是结构体类型的行类型 当内表的行类型只有一列的时候,需要使用pseudo-compnent 伪列, 用途:设置一个按钮工具栏,用只含有一列的内表. 对内表的操作 1. move对内表的拷贝 2. clear 将数据清空 3. free 释放内存 4. compare表之间的操作,比较 5. sort 排序表 6. array fetch 递归比较 1. 先对内表之间的行数进行比较 2. 如果有必有的话,还需要对行的组件进行比较 内表之间的比较 用行数比较, 有必要的话 可以 用内容比较 定义两个内表 两个 内表不兼容 一个有3个字段 一个有5个 对两个内表进行比较. 定义两个内表, 结构一样 , 变量不一样 全做成数字型字段 第一个 添加 小数字 第二个内表 添加大数字 排序可以指定升序降序. 对内表具体操作 1. Insert 插入 2. Read 读取 3. Change 修改 4. Delete 删除 5. Insert summated collect. 插入累计 对内表中的数据行进行限制条件操作 对数据的访问 一、单条数据访问 1) 通过 table key访问 2) 通过 line index 访问(对于line index 类型内表) 3) 通过 condition条件访问 二、多条数据访问 1) 通过condition条件访问 2) 通过 index interval 通过行区间访问 指定访问数据的传输方式 1. 使用 结构体 work area 进行 copy 对内表数据进行操作 2. 定义 field symblo 指针 指向访问数据,(可以直接访问数据) 3. 通过将内表插入内表的操作 重要: 不能通过line index 对hash 表 进行访问, 在排序表中插入数据.除非插入的位置 正好是排序表中规定的位置,否则会出现 运行期异常(强烈不推荐使用insert往 sorted b表中插入数据) Field symbol 指针 作用: 直接对内表进行操作,而不用再重新定义结构体对目标内表数据进行拷贝, 增大了效率. 定义指针语法: Data: var_a TYPE I VALUE 4. FIELD-SYMBOLS: fs TYPE i. ASSIGN var_a TO fs. fs = 77. 重要: 定义的指针名,必须加”<>” Insert 插入操作 一、 单条数据的插入操作 1) 标准表: 可以使用 index (推荐) 和 table key 方式插入 2) 排序表: 可以通过 table key方式插入 , 但也可以用index插入(强烈不推荐, 很有可能出现运行错误) 3) Hash表: 只能够用table key 方式插入 二、 多条记录的插入 1) 源内表为 index table : 则可以指定源内表的数据范围,并插入到目标内表中 2) 目标内表为index table: 则可以可以指定目标内表被插入数据的具体index 位置. 具体的语句插入语法: Insert wa INTO TABLE itab. 单条插入不指定位置 Insert wa INTO itab INDEX n. 单条插入指定插入位置 INSERT LINES OF itab1 [from n1 to n2] INTO TABLE itab2. INTO itab2 [ INDEX n] 读取 内表的一条 将数据 读到结构体中 如果系统独到行 sy-subrc = 0 . 然后读取到结构体中, Sy-tfill 存放总行数 Sy-tleng 行的长度 Transporting 指定特定列 传输字段 , 传送部分字段 TRANSPORTING NO Fields 不传值, 作用 ,看内表中 有没有 这条数据 Camparing 有一个结构体 和内表 C1 C2 C3 Lh 0019 17 Lh 0018 18 通过comparing 后的值, 可以判断读取的值是否符合要求. 现在结构体中需要比较的字段赋值, 先判断 相应字段是否相等 回去做个练习 比较成功 sy-subrc = 0 Zmycompare_2009 用一个结构作为 查询条件, 到内表查询符合条件的数据 With key 可以用 table key 或 普通字段作为条件 使用field symbol 通过一个内表 定义一个 结构体 作为 指针 Read table itab [index n / key ] assigning fs. Write: / fs-field_1. 直接修改 fs 的值 会怎么样? Change 修改内表 Transporting 的 传输方向 通过 field symbol 直接修改 内表 重要: 不能直接指针对sorted 和 hash表进行操作 Delete Delete table itab key Key: from wa () With table key k1 = f1…. 不能用sort 对排序表进行排序 对 sorted 表进行 insert modify , 使用不当 可能会出错 HASH表不能通过 index 进行操作 Header line With head line 关键字定义 废弃用法 Occur + 整数, 10 , Occur 0 , 默认大小, Occur 0 with head line 废弃用法了 重要: 在面向环境中 不能用带有 head line 的内表 Data: so_carr LIKE RANGE OF carrid. Loop 内表 Where 条件 从起始点二分查找 标准表 可以部分指定顺序 From 1 to 5 对于一个标准表来说, 加上二分查找 是不是 先排序 先把标准表 排序, 然后再二分 必须先手工排序,再进行二分查找 sap abap programming---关于ABAP内表(about abap internal table) 1. 内表的类型及定义: (1).ANY TABLE:即任意表类型,此种定义方式只能在传递参数的时候定义。例如:FORM XXX USING/CHANGING TYPE ANY TABLE . (2).ANY TABLE包括了两种类型:INDEX TABLE和HASHED TABLE 。 《1》.INDEX TABLE:包括了STANDARD TABLE和SORTED TABLE A. STANDARD TABLE:其实就是一个线性表,通过key访问内表是线性查找的,也就是说,随着表中记录的增加,对表的 操作的时间开销也相应的增加。 定义方法:TYPES/DATA: LIKE/TYPE STANDARD TABLE OF . B. SORTED TABLE:顾名思义,表中的记录是按照一定的顺序排列的。访问表的主要方式是表中定义的key,如果key不唯 一,则选择index最小的那个。也可以通过index来访问排序表,如果你想通过index插入一条记录,系统会自动检查你插入的 位置是否正确。所以,如果插入的时间比插入到标准表的时间会长。因此,尽量选择key来对排序表进行操作。 定义方法:TYPES/DATA: LIKE/TYPE SORTED TABLE OF . 《2》.HASHED TABLE:对哈希表只能用你定义的key进行操作,而不能使用index进行操作。因此,定义哈希表必须定义unique key 。注意:所有关于使用index操作表的语句都不能用于操作哈希表。例如:sort,loop等。 定义方法:TYPES/DATA: LIKE/TYPE HASHED TABLE OF . 2. 内表的操作: (1).创建: A. 定义一个结构,然后type/like这个结构 例如: TYPES: BEGIN OF , ... i> ..., ... END OF . DATA TYPE STANDARD TABLE OF WITH NON-UNIQUE DEFAULT KEY INITIAL SIZE WITH HEADER LINE. B. type/like系统表或者数据库表或者结构 DATA TYPE STANDARD TABLE OF 系统表名 INITIAL SIZE WITH HEADER LINE. (2).添加数据: A.APPEND:直接向表中添加数据 1. APPEND [wa TO|INITIAL LINE TO] itab[ASSIGNING |REFERENCE INTO dref]. 2. APPEND LINES OF itab1 [FROM idx1] [TO idx2] TO itab2. 3. APPEND [wa TO] itab SORTED BY f [ASSIGNING B.向表中插入数据: 1. INSERT [wa INTO|INITIAL LINE INTO] itab [INDEX idx] [ASSIGNING |REFERENCE INTO dref]. 2. INSERT [wa INTO|INITIAL LINE INTO] TABLE itab [ASSIGNING |REFERENCE INTO dref]. 3. INSERT LINES OF itab1 [FROM idx1] [TO idx2] INTO itab2 [INDEX idx3]. 4. INSERT LINES OF itab1 [FROM idx1] [TO idx2] INTO TABLE itab2. C.相同字段求和向表里添加: Basic form COLLECT [wa INTO] itab. Extras: 1. ... ASSIGNING 2. ... REFERENCE INTO dref 3. ... SORTED BY f (3).删除数据: 1. DELETE itab. 2. DELETE TABLE itab WITH TABLE KEY k1 = v1 ... kn = vn. 3. DELETE TABLE itab [FROM wa]. 4. DELETE itab INDEX idx. 5. DELETE itab FROM idx1 TO idx2. 6. DELETE itab WHERE logexp. 7. DELETE ADJACENT DUPLICATES FROM itab. (4).修改数据: 1. MODIFY itab [FROM wa] [INDEX idx] [ASSIGNING |REFERENCE INTO dref] [TRANSPORTING f1 ... fn]. 2. MODIFY TABLE itab [FROM wa] [ASSIGNING |REFERENCE INTO dref] [TRANSPORTING f1 ... fn]. 3. MODIFY itab [FROM wa] TRANSPORTING f1 ... fn WHERE cond. sap --- ABAP 内表(internal table) 标题行(header line) 工作区(work area) 简介 OCCURS 0 刚开始学ABAP的时候,学到iternal table时,感觉一阵混乱。搞不清楚什么是work area,什么是header line,以及occurs是干什么用的。今天终于差不多搞明白了(我还是太弱啊...BS自己一下) 所以还是记录下来..省得自己以后再忘记... 先是用TYPES关键字定义一个行(row)的类型.如下: TYPES: BEGIN OF line, field1 TYPE i, field2 TYPE i, END OF line. 这里的line,就相当于一个自定义的类型,表示一行(row)的字段(field). 这里一行有两个字段field1和field2. 然后是声明一个work area: DATA wa TYPE line. 我用C++(还是对cpp最有好感^^)的概念理解就是, line是一个class,而wa是一个object. 接着是声明一个每一行的类型是line的internal table: DATA itab TYPE line OCCURS 0. 我在暂时把OCCURS作为了区别工作区和内表的标志. OCCURS应该有更深层次的意义,但我目前只能领悟至此... 当我们用以上这个方法来声明一个iternal table时,可以选择是否有无header line. 上面这句就是没有header line的.改成如下就有了: DATA itab TYPE line OCCURS 0 WITH HEADER LINE. 有无header line的区别就是,header line可以当作一个work area来使用(参照我之前的一个日志). 有一下两种方式操作itab: 1). wa-field1 = 1. wa-field2 = 2. APPEND wa TO itab. 2). itab-field1 = 1. itab-field2 = 2. APPEND itab. 这里wa就是上面那个已经定义的work area. 有header line的时候,这两种都可以. 无header line的时候,只能用第1种. 第2种里,itab的意义是一个header line,而不是内表. 因为"DATA itab TYPE line OCCURS 0 WITH HEADER LINE."这样的声明, 已经隐式声明了一个与内表同名的header line. 所以OCCURS用来声明内表可能造成二义性(ambiguous). 于是,OCCURS被认为是old的东西,采用一下方式声明一个内表比较好: DATA itab TYPE STANDARD TABLE OF line. 还有一种声明内表的方法: DATA: BEGIN OF itab OCCURS 0, field1 TYPE i, field2 TYPE i, END OF itab. 这样的itab就自动有了一个同名的header line. 好像不会有 WITHOUT HEADER LINE 或者 NOT WITH HEADER LINE 这样的用法... 如果没有OCCURS 0,比如这样: DATA: BEGIN OF itab, field1 TYPE i, field2 TYPE i, END OF itab. 那么这个itab就不是内表咯,只是一个structure,可以作为itab的work area. 写到这里发现,归根到底就是TYPES和DATA这两个关键字的区别嘛. 还有有无OCCURS的区别. 这样一想,简单明了~~ OCCURS 是在3.0以前申明内表的关键字。意思是内表初始的时候有多少行。现在不提倡使用。看到了认识就行。 ======================================================= ABAP Work Area & Header Line - 1. Difference between Work Area and Header Line 工作区与标题行的不同之处 原文地址: http://www.sap-img.com/abap/difference-between-work-area-and-header-line.htm 我翻译下,嘿嘿 在对内表进行一些操作的时候,比如增加或者取回一条记录.我们必须暂时保存这条记录. 这条记录就保存在内表的工作区里(work area).内表的工作区必须和内表有相同的结构. 内表由主体(body)和一个可选的标题行(head line)组成. 标题行是一个隐式的(implicit)工作区.在内表声明的时候,可以选择有无标题行. e.g. data: begin of itab occurs 10, ab type c, cd type i, end of itab. 这样的内表itab,是有标题行的. data: wa_itab like itab. 这样的wa_itab是显式(explicit)声明的一个itab的工作区. data: itab1 like itab occurs 10. 这样的内表itab1,是没有标题行的. 标题行是一个和内表主体有着一样结构的字段的串,标题行只有一行. 所以,标题行相当于一个缓冲区(buffer),用于存放被操作的纪录,是内表的缺省的工作区. 2. Using Header Lines as Work Areas 把标题行当工作区来使用 原文地址: http://help.sap.com/saphelp_nw04/helpdata/en/fc/eb36a1358411d1829f0000e829fbfe/content.htm 我再翻译下... 当你在创建一个内表的时候,你同时也声明了一个具有相同名称的标题行(这个好像很奇特的样子么...).可以把这个标题行当作工作区来对内表进行操作. 如果一个内表有标题行,则对其进行操作的ABAP语句会简短一些,因为这些语句会自动认为标题行是一个隐式的工作区.语句的不同如下表: Operations without header line Operations with header line Operations for all Table Types INSERT INTO TABLE . INSERT TABLE ITAB. COLLECT INTO . COLLECT . READ TABLE ... INTO . READ TABLE ... MODIFY TABLE FROM ... MODIFY TABLE ... MODIFY FROM ...WHERE ... MODIFY ... WHERE ... DELETE TABLE FROM . DELETE TABLE . LOOP AT ITAB INTO ... LOOP AT ITAB ... Operations for Index Tables APPEND TO . APPEND . INSERT INTO ... INSERT ... MODIFY FROM ... MODIFY ... 但是,用隐式的工作区,代码难以被理解,所以还是用一个不同名称的工作区比较好. sap abap---通过例子学习ABAP--初始化内表 清空内表 初始化内表的作用是清空内表所有的数据行,将内表恢复到填充或赋值之前的状态。初始化内表过程中需要注意之处仍然是初始化无 表头行内表和有表头行内表的区别,以及初始化内表和表头行的区别。 (1)CLEAR ITAB. 同时清空表头和行内表的值 (2)CLEAR ITAB. 只清空内表本身的值,保留表头行的值。 (3)REFRESH I TAB 只清空内表本身的值,保留表头行的值。 (4)FREE ITAB. 只清空内表本身的值,保留表头行的值。 DATA: BEGIN OF line, col1(1) TYPE c, col2(1) TYPE c, END OF line. DATA itab LIKE TABLE OF line WITH HEADER LINE. line-col1 = 'A'. line-col2 = 'B'. APPEND line TO itab. loop at itab. write : itab-col1. endloop. clear itab. "在这里可以尝试CLEAR ITAB[],FREE ITAB,REFRESH ITAB,看看效果是不是如上所说这样。 IF itab IS INITIAL. WRITE 'ITAB is empty'. ENDIF. 很多程序BUG,就是这一类 不起眼的东西引起的~ ********************************************************************* *-------- Clear & Refresh Internal Table. ------------------------- ********************************************************************* 1. with headerline. CLEAR itab. : Clear the headerline of the Internal Table only. CLEAR itab[]. : Clear the contents of the Internal Table except the headerline. REFRESH itab. : Same as CLEAR itab[]. REFRESH itab[]. : Same as CLEAR itab[]. 2. without headerline. ( all four commands have same functionality ) CLEAR itab. : Clear all contents of the Internal Table. CLEAR itab[]. : Same as CLEAR itab. REFRESH itab. : Same as CLEAR itab. REFRESH itab[]. : Same as CLEAR itab. 如何一次性的给内表的一列赋值,不用LOOP循环来做,比如把第一列都给设置成空. CLEAR 对应工作区清空 MODIFY 内表 FROM 内表对应工作区 TRANSPORTING 修改字段 WHERE 修改字段 <> SPACE. MODIFY itab [FROM wa] TRANSPORTING f1 ... fn WHERE cond 这句话的意思是凡是内表itab中满足条件cond的记录都被工作区wa的数据修改,修改的字段是f1...f 4月4日 sap abap programming----CALL TRANSACTION USING bdc_tab for Data Transfer http://help.sap.com/saphelp_sm32/helpdata/en/fa/09715a543b11d1898e0000e8322d00/frameset.htm DATA: it_bdcdata TYPE TABLE OF bdcdata, wa_bdcdata TYPE bdcdata. wa_bdcdata-program = 'SAPLBTCH'. wa_bdcdata-dynpro = '2170'. wa_bdcdata-dynbegin = 'X'. APPEND wa_bdcdata TO it_bdcdata. CLEAR wa_bdcdata. wa_bdcdata-fnam = 'BTCH2170-JOBNAME'. wa_bdcdata-fval = '*'. APPEND wa_bdcdata TO it_bdcdata. wa_bdcdata-fnam = 'BTCH2170-USERNAME'. wa_bdcdata-fval = sy-uname. APPEND wa_bdcdata TO it_bdcdata. CALL TRANSACTION 'SM37' USING it_bdcdata. -------------------------------------------------------- Submit to executable program via selection options -------------------------------------------------------- SUBMIT zrmm0001 VIA SELECTION-SCREEN AND RETURN WITH p_matnr = itab-matnr WITH p_werks = itab-werks WITH p_lgort = itab-lgort WITH s_charg = itab-charg WITH p_num = p_label WITH p_dest = p_print. ---------------------------------------------------------- Submit to program which not has selection screen ---------------------------------------------------------- SET PARAMETER ID 'RBN' FIELD S_ARSEG-BELNR. SET PARAMETER ID 'GJR' FIELD S_ARSEG-GJAHR. CALL TRANSACTION 'MIR4' AND SKIP FIRST SCREEN. sap abap programming----execute--Call Underlying Database Store Procedure in ABAP 摘自sapguys.cn群中Robbin和徐的交流 1. 配置个外部DB, T-code为: DB59, DB50N, 测试连接 2. 执行Native SQL eg: EXEC SQL. EXECUTE PROCEDURE EAI_ETL_CONTROL(IN :XX1,IN :XX2,IN :wa_datet_update,IN :XX3,OUT :YY1) ENDEXEC. sap ABAP 常用函数(sap abap function) RS_VARIANT_VALUES_TECH_DATA 可以返回一个内表, 里面存的是PARAMETER SELECT-OPTION的名字 以及对应的值. 可用于background job中对vaiant的修改. 函数名 描述 SD_VBAP_READ_WITH_VBELN 根据销售订单读取表vbap中的信息 EDIT_LINES 把READ_TEXT返回的LINES中的行按照TDFORMAT=“*”重新组织 VIEW_MAINTENANCE_CALL 维护表视图 函数名 描述 DY_GET_FOCUS 获得屏幕焦点 DY_GET_SET_FIELD_VALUE 获得或者设置屏幕字段的值 函数名 描述 F4IF_INT_TABLE_VALUE_REQUEST 显示检索help READ_TEXT 读取长文本 CONVERSION_EXIT_CUNIT_OUTPUT 单位转换 SJIS_DBC_TO_SBC 全角转半角 SJIS_SBC_TO_DBC 半角转换为全角 CO_R0_CHECK_DECIMAL_POINT 根据单位检查数据的小数位 POSTAL_CODE_CHECK 检查邮政编码 函数名 描述 CONVERSION_EXIT_ALPHA_INPUT 全数字则在前面补0 CONVERSION_EXIT_ALPHA_INPUT 和上面相反 GET_JOB_RUNTIME_INFO 获得job相关信息 TERMINAL_ID_GET 获得端末id DATE_CONVERT_TO_FACTORYDATE 把输入日期转为工厂日历日期 MESSAGE_TEXT_BUILD 把消息转为文本 函数名 描述 POPUP_TO_CONFIRM 弹出确认窗口 函数名 描述 CONVERSION_EXIT_MATN1_INPUT 物料号码转换函数 CONVERSION_EXIT_MATN1_OUTPUT 同上相反 CONVERT_TO_LOCAL_CURRENCY 按照指定日期汇率转换金额为指定货币类型 SSF_FUNCTION_MODULE_NAME 根据form名取得对应的函数名(SmartForm) 函数名 描述 DATE_CHECK_PLAUSIBILITY 日期CHECK cl_gui_frontend_services=>gui_upload 上传到服务器 cl_gui_frontend_services=>gui_download 下载到服本地 SSF_FUNCTION_MODULE_NAME SMARTFORMS输出报表时,生成一个函数名称,然后CALL这个名称 函数名 描述 POPUP_TO_DECIDE_LIST 弹出供选择窗口 ABAP_DOCU_DOWNLOAD – 以HTML格式下载ABAP文档。 ARFC_GET_TID – 以十六进制形式返回终端的IP地址。 BAL_* -容纳了SAP的应用程序日志所有的函数模块。 BP_EVENT_RAISE –在 ABAP/4 程序中触发一个事件。 BP_JOBLOG_READ –获得job log的执行结果。 CLOI_PUT_SIGN_IN_FRONT – 将负号前置, SAP默认将负号放在数字后面。 CLPB_EXPORT –从内表导入到剪贴板。 CLPB_IMPORT – 从剪贴板导入内表。 COMMIT_TEXT -To load long text into SAP 。 CONVERSION_EXIT_ALPHA_INPUT - 数字串前补0 example: input = 123 output = 0000000000000。。。000000000000123 CONVERSION_EXIT_ALPHA_OUTPUT – 消除数字串前的0 example: input = 00000000000123 output = 123 CONVERT_OTF – 将SAP文档(SAP Script)转换成其他类型。 example: CALL FUNCTION 'CONVERT_OTF' EXPORTING FORMAT = 'PDF' IMPORTING BIN_FILESIZE = FILE_LEN TABLES OTF = OTFDATA LINES = PDFDATA EXCEPTIONS ERR_MAX_LINEWIDTH = 1 ERR_FORMAT = 2 ERR_CONV_NOT_POSSIBLE = 3 OTHERS = 4. DATE_GET_WEEK – 返回一个日期所在的周数。 DATE_CHECK_PLAUSIBILITY – 检查一个日期是否是SAP的有效格式。 DYNP_VALUES_READ – 读取SCREEN字段的值,也可以用来读取报表SELECTION SCREEN。 DYNP_VALUES_UPDATE -更新屏幕字段的值。 ENQUE_SLEEP –在继续处理之前等待一个指定的时间。 ENQUEUE_ESFUNCTION – 锁定一个ABAP程序使它不可以被执行: RELID = 'ZZ' SRTF2 = 0 SRTF = (your report name) 注意不要用SY-REPID来传递你的报表名字,当把SY-REPID作为参数传递给函数模块的时候,SY-REPID的值实际上已经发生了变化。 EPS_GET_FILE_ATTRIBUTES – 获得文件属性。 EPS_GET_DIRECTORY_LISTING – 返回一个本地或网络目录的文件列表。 F4_DATE - 弹出一个窗口显示一个日历允许用户选择一个日期。 F4IF_SHLP_EXIT_EXAMPLE – F4接口模块。 FILENAME_GET – 弹出一个文件选择对话框。 DATA out(60) TYPE c. CALL FUNCTION 'FILENAME_GET' EXPORTING filename = 'c:\1.txt' title = 'GET FILENAME' IMPORTING filename = OUT. FTP_CONNECT – 打开并登陆FTP服务器的连接。 FTP_COMMAND – 在FTP服务器上执行一个命令。 FTP_DISCONNECT –关闭指向FTP服务器的连接。 FORMAT_MESSAGE - Takes a message id and number, and puts it into a variable。 Works better than WRITE_MESSAGE, since some messages use $ as a place holder, and WRITE_MESSAGE does not accommodate that, it only replaces the ampersands (&) in the message。 GET_GLOBAL_SYMBOLS – 返回一个程序的tables, select options, texts, etc 。甚至包含selection screen的文本定义。 GET_INCLUDETAB – 获得一个程序的INCLUDES列表。 GUI_CREATE_DIRECTORY –在显示服务器端创建一个目录 。 GUI_DELETE_FILE – 在显示服务器端删除一个文件 。 GUI_DOWNLOAD – 从应用服务器下载内表到显示服务器。 GUI_EXEC – 调用一个文件或程序,取代了WS_EXECUTE。 GUI_GET_DESKTOP_INFO – 获得客户端桌面信息,取代了WS_QUERY。 GUI_REMOVE_DIRECTORY – 从显示服务器删除一个目录 。 GUI_RUN – 启动一个文件或程序 。 GUI_UPLOAD – 从显示服务器上传文件到应用服务器,取代了WS_UPLOAD。 HELP_START – 为一个字段显示帮助。 Useful for doing AT SELECTION SCREEN ON VALUE REQUEST for those fields that do not provide F4 help at the DDIC level。 HOLIDAY_GET – 基于Factory Calendar&/ Holiday Calendar提供了一个节日表。 INIT_TEXT –上传长文本到SAP。 K_WERKS_OF_BUKRS_FIND – 返回一个特定公司代码的所有工厂。 LIST_TO_ASCII –将ABAP报表从 OTF形式转换成ASCII 形式。 LIST_FROM_MEMORY – Retrieves the output of a report from memory when the report was executed using SUBMIT。。。EXPORTING LIST TO MEMORY。 See also WRITE_LIST。 MONTH_NAMES_GET – 获得所有的月和名字 **** MS_EXCEL_OLE_STANDARD_OLE – 创建一个文件并自动启动Excel 。 CONVERT_OTFSPOOLJOB_2_PDF - converts a OTF spool to PDF (i。e。 Sap script document) CONVERT_ABAPSPOOLJOB_2_PDF -convert ABAP spool output to PDF POPUP_TO_CONFIRM_LOSS_OF_DATA – 弹出一个对话框告知用户有可能丢失数据,询问是否操作继续。 POPUP_TO_CONFIRM_STEP -弹出一个对话框询问用户是否操作继续。 POPUP_TO_CONFIRM_WITH_MESSAGE 可以显示定制的提示信息的确认窗口 类似POPUP_TO_CONFIRM_STEP,只是多三行的文本错误诊断提示。 POPUP_TO_CONFIRM_WITH_VALUE 用此函数可以建立一个对话框用于询问用户是否执行某步操作,该操作可能会丢失数据,用户可以选择Yes No 或者Cancel。该函数可以传入一个标题,两行的文本(提示问题)和一个对象值 POPUP_TO_DECIDE 显示一个对话框,用户可以两个操作中的一个或者取消。可以传入三行提示文本 POPUP_TO_DECIDE_WITH_MESSAGE 类似POPUP_TO_DECIDE POPUP_TO_DISPLAY_TEXT 显示多行信息的窗口 POPUP_TO_SELECT_MONTH –弹出一个对话框供选择月。 POPUP_WITH_TABLE_DISPLAY -Provide a display of a table for user to select one, with the value of the table line returned when selected。 PRICING – 获得定价条件 PROFILE_GET - 从INI文件读取一条记录 PROFILE_SET – 往INI文件写一条记录 READ_TEXT – 上传长文本 REGISTRY_GET – 从注册表读取一条记录 REGISTRY_SET – 在注册表里设置一条记录 RFC_ABAP_INSTALL_AND_RUN – 当MODE参数值为‘F’时运行PROGRAM表中的程序'. RH_GET_ACTIVE_WF_PLVAR – 获得激活的HR计划 RH_START_EXCEL_WITH_DATA – 启动Excel并用内表给文件赋值 RH_STRUC_GET –返回所有相关的组织信息 RP_CALC_DATE_IN_INTERVAL – 年月日加减 RP_LAST_DAY_OF_MONTHS – 获得一个月的最后一天 RPY_DYNPRO_READ – 读取屏幕 RPY_TRANSACTION_READ – 给定一个事务代码,获得其程序和屏幕;或给定一个程序和屏幕获得事务代码 RS_COVERPAGE_SELECTIONS – 获得一个报表的选择参数列表。 RS_REFRESH_FROM_SELECTOPTIONS –获得当前选择屏幕的内容 RS_SEND_MAIL_FOR_SPOOLLIST – 在程序中给SAP office 发送消息 RS_VARIANT_CONTENTS – 获得一个变式的内容 RZL_SLEEP – 将当前程序挂起 RZL_SUBMIT – 提交一个远程报表 RZL_READ_DIR_LOCAL – 读取应用服务器的目录 RZL_READ_DIR – 如果服务器名字左部为空,从本地读取目录,否则读取远程服务器的目录 RZL_READ_FILE – 如果为给定服务器名字则读取本地文件,否则读取远程服务器文件。 RZL_WRITE_FILE_LOCAL - 将内表保存到显示服务器(not PC). 不使用OPEN DATASET因此避免了授权检查。 SAPGUI_PROGRESS_INDICATOR – 显示一个进度条 SAVE_TEXT – 上传长文本 SCROLLING_IN_TABLE –当编写模块池的时候可以用它来处理滚动 SD_DATETIME_DIFFERENCE – 两日期作差 SO_NEW_DOCUMENT_ATT_SEND_API1 - 将文档作为邮件的一部分发送 SO_SPLIT_FILE_AND_PATH – 将一个包含路径的全文件名分割为文件名和路径 SO_SPOOL_READ – 根据SPOOL号获得printer spool SO_WIND_SPOOL_LIST – 根据用户浏览printer spool号 SX_OBJECT_CONVERT_OTF_PDF – 从OTF转换为PDF (SAP 脚本转换) SX_OBJECT_CONVERT_OTF_PRT – 从OTF转换为打印机格式(SAP 脚本转换) SX_OBJECT_CONVERT_OTF_RAW – 从OTF转换为ASCII(SAP 脚本转换) SXPG_CALL_SYSTEM - 检查用户是否有执行某个命令的权限 SXPG_COMMAND_LIST_GET – 获得一个包含所有定义的外部OS命令的列表. SXPG_COMMAND_DEFINITION_GET – 从R/3系统数据库读取单个外部OS命令的定义 SXPG_COMMAND_CHECK - 检查用户是否有执行某个命令的权限 SXPG_COMMAND_EXECUTE -检查用户是否有执行某个命令的权限,拥有授权则执行命令 TERMINAL_ID_GET –返回终端ID TH_DELETE_USER – 剔除一个用户,效果同SM04 TH_ENVIRONMENT – 获得UNIX环境 TH_POPUP –在特定用户屏幕上显示一个系统消息 TH_REMOTE_TRANSACTION – 在远程服务器上运行事务代码 TH_USER_INFO – 获得当前用户的信息 (会话,登陆的工作台等) TH_USER_LIST –显示登陆到应用服务器的用户列表 UNIT_CONVERSION_SIMPLE –衡量单位转换 UPLOAD –上传文件到显示服务器 UPLOAD_FILES – 上传一个或多个文件 WRITE_LIST –显示一个列表对象 WS_DOWNLOAD –将内表下载到显示服务器 WS_EXCEL –启动EXCEL WS_EXECUTE –执行一个程序 WS_FILE_DELETE – 删除一个文件 WS_FILENAME_GET –调用文件选择对话框 WS_MSG –显示一个对话框显示在线消息 WS_UPLOAD – 从显示服务器上传文件到内表 WS_VOLUME_GET –获得终端设备标签 WWW_LIST_TO_HTML – 运行一个报表之后,调用这个方法将列表输出转换成HTML SD_VBAP_READ_WITH_VBELN 根据销售订单读取表vbap中的信息 EDIT_LINES 把READ_TEXT返回的LINES中的行按照TDFORMAT=“*”重新组织 VIEW_MAINTENANCE_CALL 维护表视图 DY_GET_FOCUS 获得屏幕焦点 DY_GET_SET_FIELD_VALUE 获得或者设置屏幕字段的值 F4IF_INT_TABLE_VALUE_REQUEST 显示检索help CONVERSION_EXIT_CUNIT_OUTPUT 单位转换 SJIS_DBC_TO_SBC 全角转半角 SJIS_SBC_TO_DBC 半角转换为全角 CO_R0_CHECK_DECIMAL_POINT 根据单位检查数据的小数位 POSTAL_CODE_CHECK 检查邮政编码 GET_JOB_RUNTIME_INFO 获得job相关信息 TERMINAL_ID_GET 获得终端 idDATE_CONVERT_TO_FACTORYDATE 把输入日期转为工厂日历日期 MESSAGE_TEXT_BUILD 把消息转为文本 CONVERT_TO_LOCAL_CURRENCY 按照指定日期汇率转换金额为指定货币类型 SSF_FUNCTION_MODULE_NAME 根据form名取得对应的函数名(SmartForm) DATE_CHECK_PLAUSIBILITY 检查日期合法性 CHECKcl_gui_frontend_services=>gui_upload 上传到服务器 cl_gui_frontend_services=>gui_download 下载到本地 SSF_FUNCTION_MODULE_NAME SMARTFORMS输出报表时,生成一个函数名称,然后CALL这个名 通过这个日期得出那天是星期几 DAY_IN_WEEK 用来得到将来/过去的日期的 RP_CALC_DATE_IN_INTERVAL 日期的加减 BKK_ADD_MONTH_TO_DATE 一组有用的用户交互窗口函数 POPUP_TO_CONFIRM_LOSS_OF_DATA 显示有YES/NO的弹出窗口,提示用户未保存的数据将丢失 POPUP_TO_CONFIRM_STEP 提示是否确认操作的弹出窗口 POPUP_TO_CONFIRM_WITH_MESSAGE 可以显示定制的提示信息的确认窗口 POPUP_TO_CONFIRM_WITH_VALUE 显示确认用户对某个特定对象的操作的弹出窗口 POPUP_TO_DECIDE 将待确认选项以单选按钮的方式显示的弹出窗口 POPUP_TO_DECIDE_WITH_MESSAGE 带消息的确认窗口 POPUP_TO_DISPLAY_TEXT 显示多行信息的窗口 POPUP_TO_SELECT_MONTH 月份选择窗口 POPUP_WITH_TABLE_DISPLAY 有表格对象的确认窗口 一组操纵客户端文件系统的函数 GUI_CREATE_DIRECTORY 在PC上建立文件目录 GUI_DELETE_FILE 删除PC上的文件 GUI_DOWNLOAD 文件下载函数 GUI_EXEC 执行PC上的程序,或者打开文件 GUI_GET_DESKTOP_INFO 得到PC客户端的系统信息,比如操作系统等 GUI_REMOVE_DIRECTORY 删除PC目录 GUI_RUN 运行PC程序(ShellExecute) GUI_UPLOAD 从PC上传程序 判断某天是否是假日 HOLIDAY_CHECK_AND_GET_INFO ABAP_DOCU_DOWNLOAD Download ABAP documentation in HTML format. GET_CURRENT_YEAR 得到当前的财政年(fiscal year) 察看某日期的属性,包括该日期是星期几,第几天(周2=2),是不是公共假期等,需要输入国家日历。 DAY_ATTRIBUTES_GET Return useful information about a day. Will tell you the day of the week as a word (Tuesday), the day of the week (2 would be Tuedsay), whether the day is a holiday, and more.(provided by Francois Henrotte)? CLPB_IMPORT :从剪贴板导入internal table CLPB_EXPORT : 从internal table输入到剪贴板 示例程序:GRCLPB_1 sap abap programming---关于ABAP程序执行效率和优化(z) 程序的效率是每个程序员都应该重视的,无论是采用的哪一种语言进行开发。在我做过的一个项目中,一个几万条数据的运行,在没有考虑效率,对代码没有进行优化前的运行时间是7个小时,当对代码进行一系列的优化修改后,运行的时间就只剩一个小时,由此可见,代码的优化是多么的重要。那么,我们在写ABAP程序时,怎样的语句才能提高到效率呢,下面是我总结到的几点: 1、抽取数据时,避免使用SELECT *, 尽量使用SELECT A B INTO TABLE ITAB这样的语句。 2、不要使用SELECT...ENDSELECT语句。 3、尽量避免在LOOP中访问数据库。可以在之前先把数据取到内表,在LOOP中用READ TABLE WITH KEY ... BINARY SEARCH.进行读取对应的数据。 4、用SORT代替ORDER BY。 5、避免使用嵌套的循环。 6、尽量不要使用JOIN进行多表连接。把一个表的数据先取到内表,然后使用FOR ALL ENTRIES语句再进行抽取。 7、使用二分查找法。READ TABLE的之前使用SORT TABLE BY对内表进行排序, 然后使用READ TABLE WITH KEY ...BINARY SEARCH. 8、避免使用SELECT DISTINCT语句。在抽取数据到内表后用DELETE ADJACENT DUPLICATES语句来消除重复行。 9、尽量加多WHERE语句进行条件抽取。 以上,说的还不全,会进行不断更新。另外,可以通过TCODE:ST05 SE30 进行程序和SQL语句性能和效率的分析。 sap 在ABAP 中 MOVE ... TO 和 WRITE ... TO 的区别 WRITE ... TO 把源的格式附值到目标。 MOVE ... TO 直接把源的值附到目标。 示例: data: gv_char1(20) type c, gv_char2(20) type c, dec1(10) type p decimals 2 value '22345.89'. start-of-selection. * date * write:/ 'date variable'. write sy-datum to gv_char1. write:/ 'write to', gv_char1. move sy-datum to gv_char2. write:/ 'move to', gv_char2. skip 1. * decimal * write:/ 'decimal variable'. write dec1 to gv_char1. write:/ 'write to', gv_char1. move dec1 to gv_char2. write:/'move to', gv_char2. Assigning Values with MOVE To assign the value of a data object source to a variable destination, use the following statement: MOVE source TO destination. or the equivalent statement destination = source. The content of source remains unchanged, source does not therefore have to be a variable - it can also be a literal, a text symbol, or a constant. You must always specify decimal points with a period (.), regardless of the user’s personal settings. Multiple assignments f4 = f3 = f2 = f1. are also possible. ABAP processes them from right to left as follows: MOVE f1 TO f2. MOVE f2 TO f3. MOVE f3 TO f4. In the MOVE statement (or when you assign one value to another with the equal sign), it is not possible to specify the field names dynamically as the contents of other fields. If you need to do this, you must use field symbols . The source and target fields can be of different data types. The result of the value assignment depends on whether these data types are compatible and whether a type conversion can be performed. If there is no conversion rule between the data types in question, no assignment can be made. DATA: t(10) TYPE c, number TYPE p DECIMALS 2, count TYPE i. t = 1111. MOVE '5.75' TO number. count = number. Following these assignments, the fields t, number and count have the values ‘1111 ’, 5.75, and 6 respectively. When you assign the number literal 1111 to T, it is converted into a character field with length 10. When you assign number to count , the decimal number is rounded to an integer (as long as the program attribute Fixed pt. arithmetic has been set). Assigning Values Between Components of Structures The rules for value assignments between data objects also apply to structures. With the command DATA: struct1 TYPE structure, struct2 TYPE structure. struct1 = struct2. two structures of the same type can be assigned to one another without difficulty. Here, the entire source structure is seen as a unit and copied to the source structure. It is then possible to access the components individually again. If the structures in question are not compatible, see the conversion rules for structures. In practice, however, you will often only need to assign certain components of a structure to be certain components of another structure. ABAP has a special statement for this purpose: MOVE-CORRESPONDING sourcestruct TO destinationstruct. This statement assigns the contents of the components of structure sourcestruct to the components of the destinationstruct structure that have identical names. When it is executed, it is broken down into a set of MOVEstatements, one for each pair of fields with identical names, as follows: MOVE sourcestruct-comp1 TO destinationstruct-comp1. MOVE sourcestruct-comp2 TO destinationstruct-comp2. ... Any necessary type conversions are performed individually. DATA: BEGIN OF address, firstname(20) TYPE c VALUE 'Fred', surname(20) TYPE c VALUE 'Flintstone', initials(4) TYPE c VALUE 'FF', street(20) TYPE c VALUE 'Cave Avenue', number TYPE i VALUE '11', postcode(5) TYPE n VALUE '98765', city(20) TYPE c VALUE 'Bedrock', END OF address. DATA: BEGIN OF name, surname(20) TYPE c, firstname(20) TYPE c, initials(4) TYPE c, title(10) TYPE c VALUE 'Mister', END OF name. MOVE-CORRESPONDING address TO name. In this example, the values of name-surname, name-firstname and name-initials are set to 'Flintstone’, ‘Fred’, and 'FF'. name-title always has the value ‘Mister’. sap ABAP--关于Data Reference的使用---FIELD-SYMBOLS Data References(只能指向abap定义的基本数据或者基本数据组合体) 1、定义数据参考变量(Data References) DATA dref TYPE REF TO DATA.(指向任意类型,但在创建时必须指定对象类型) DATA dref TYPE REF TO DATA_TYPE. 或者 TYPES t_dref TYPE REF TO DATA. DATA dref TYPE t_dref. 在完成地址变量定义时,变量没有指向任何对象,此时你不可引用。只有在变量赋值后在引用。地址变量的赋值有两种方法: CREATE DATA GET REFERENCE OF dobj INTO dref. 2、动态创建数据参考的内存空间(CREATE DATA) CREATE DATA dref {TYPE type}|{LIKE dobj}这种语句创建的对象没有名称,只有地址变量指向该内存变量;在申明参考变量时,未指定类型则必须加{TYPE type}|{LIKE dobj}说明。 有时需要动态创建动态类型数据对象,语法如下 CREATE DATA dref TYPE (name). 3、将数据地址赋值给数据参考变量(GET REFERENCE) GET REFERENCE OF dobj INTO dref. 4、访问数据参考变量指定的数据 访问数据参考变量指定的数据有两种情况: 1) 对于使用DATA dref TYPE REF TO DATA_TYPE来声明的数据参考变量,程序可以直接通过->*运算符直接访问数据; 代码样例 types: begin of STRUC_1, A type I, B type ref to SFLIGHT, C type P, end of STRUC_1. data: S1 type STRUC_1. types: begin of STRUC_2, X(10) type C, Y type ref to STRUC_1, Z type I, end of STRUC_2. data: S2 type STRUC_2, R2 type ref to STRUC_2. if S1-A > 10. create data S1-B. S1-B->CARRID = 'LH'. S1-B->PAYMENTSUM = 1000. endif. S2-Y->A = 100. S2-Y->*-A = 200. "Same as S2-Y->A S2-Y->B->FLDATE = SY-DATUM. 2) 对于使用DATA dref TYPE REF TO DATA来声明的数据参考变量,程序如果要访问数据参考变量指定的数据,你首先要将数据参考变量赋值给一个字段符号(Field sysbol)(是不能直接通过数据参考变量来访问的).如果数据参考变量为初始化状态, sy-subrc就返回4。 ASSIGN dref->* TO 代码样例 DATA: numref TYPE REF TO DATA, number TYPE I VALUE 123. FIELD-SYMBOLS: GET REFERENCE OF number INTO numref. ASSIGN numref->* TO fs. |